import axios, {
  AxiosError,
  InternalAxiosRequestConfig,
  AxiosResponse,
} from "axios";
import { ResultTypeEnum } from "./enum";

import { ElMessage } from "element-plus";

const config = {
  // 默认地址请求地址，可在 .env.** 文件中修改
  baseURL: import.meta.env.VITE_API_URL as string,
  // 设置超时时间
  timeout: ResultTypeEnum.TIMEOUT as number,
  // 跨域时候允许携带凭证
  withCredentials: true,
};

export const http = axios.create(config);

/**
 * @use 请求拦截器
 * 客户端发送请求 -> [请求拦截器] -> 服务器
 * token校验(JWT) : 接受服务器返回的 token,存储到 vuex/pinia/本地储存当中
 */
http.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // console.log("请求拦截", config);

    const token = localStorage.getItem("token");
    if (token) {
      config.headers.token = `${token}`;
    }
    return config;
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  }
);

/**
 * @use 响应拦截器
 *  服务器换返回信息 -> [拦截统一处理] -> 客户端JS获取到信息
 */
http.interceptors.response.use(
  (response: AxiosResponse) => {
    const { data } = response;
    // 请求失败
    if (data.code == ResultTypeEnum.ERROR) {
      console.log("data.code", data.code);

      ElMessage.error(data.msg);
      return Promise.reject(`${data.msg}`);
    }
    // console.log("响应拦截", data);
    return data;
  },
  (error: AxiosError) => {
    return Promise.reject(error);
  }
);
